home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / a_utils / yacc / flexyacc / aflex.lha / aflex / src / vstringS.a < prev   
Text File  |  1991-05-16  |  14KB  |  312 lines

  1. -- UNIT: generic package spec of VSTRINGS
  2. --
  3. -- FILES: vstring_spec.a in publiclib
  4. --        related file is vstring_body.a in publiclib
  5. --
  6. -- PURPOSE:  An implementation of the abstract data type "variable-length
  7. --           string."
  8. --
  9. -- DESCRIPTION:  This package provides a private type VSTRING.  VSTRING objects
  10. --               are "strings" that have a length between zero and LAST, where
  11. --               LAST is the generic parameter supplied in the package
  12. --               instantiation.
  13. --
  14. --               In addition to the type VSTRING, a subtype and two constants
  15. --               are declared.  The subtype STRINDEX is an index to a VSTRING,
  16. --               The STRINDEX constant FIRST is an index to the first character
  17. --               of the string, and the VSTRING constant NUL is a VSTRING of
  18. --               length zero.  NUL is the default initial value of a VSTRING.
  19. --
  20. --               The following sets of functions, procedures, and operators
  21. --               are provided as operations on the type VSTRING:
  22. --
  23. --               ATTRIBUTE FUNCTIONS:  LEN, MAX, STR, CHAR
  24. --                 The attribute functions return the characteristics of
  25. --                 a VSTRING.
  26. --
  27. --               COMPARISON OPERATORS: "=", "/=", "<", ">", "<=", ">="
  28. --                 The comparison operators are the same as for the predefined
  29. --                 type STRING.
  30. --
  31. --               INPUT/OUTPUT PROCEDURES: GET, GET_LINE, PUT, PUT_LINE
  32. --                                        
  33. --                 The input/output procedures are similar to those for the
  34. --                 predefined type STRING, with the following exceptions:
  35. --
  36. --                   - GET has an optional parameter LENGTH, which indicates
  37. --                     the number of characters to get (default is LAST).
  38. --
  39. --                   - GET_LINE does not have a parameter to return the length
  40. --                     of the string (the LEN function should be used instead).
  41. --
  42. --               EXTRACTION FUNCTIONS: SLICE, SUBSTR, DELETE
  43. --                 The SLICE function returns the slice of a VSTRING between
  44. --                 two indices (equivalent to STR(X)(A .. B)).
  45. --
  46. --                 SUBSTR returns a substring of a VSTRING taken from a given
  47. --                 index and extending a given length.
  48. --
  49. --                 The DELETE function returns the VSTRING which results from
  50. --                 removing the slice between two indices.
  51. --
  52. --               EDITING FUNCTIONS: INSERT, APPEND, REPLACE
  53. --                 The editing functions return the VSTRING which results from
  54. --                 inserting, appending, or replacing at a given index with a
  55. --                 VSTRING, STRING, or CHARACTER.  The index must be in the
  56. --                 current range of the VSTRING; i.e., zero cannot be used.
  57. --
  58. --               CONCATENATION OPERATOR:  "&"
  59. --                 The concatenation operator is the same as for the type
  60. --                 STRING.  It should be used instead of APPEND when the
  61. --                 APPEND would always be after the last character.
  62. --
  63. --               POSITION FUNCTIONS: INDEX, RINDEX
  64. --                 The position functions return an index to the Nth occurrence
  65. --                 of a VSTRING, STRING, or CHARACTER from the front or back
  66. --                 of a VSTRING.  Zero is returned if the search is not
  67. --                 successful.
  68. --
  69. --               CONVERSION FUNCTIONS AND OPERATOR: VSTR, CONVERT, "+"
  70. --                 VSTR converts a STRING or a CHARACTER to a VSTRING.
  71. --
  72. --                 CONVERT is a generic function which can be instantiated to
  73. --                 convert from any given variable-length string to another,
  74. --                 provided the FROM type has a function equivelent to STR
  75. --                 defined for it, and that the TO type has a function equiv-
  76. --                 elent to VSTR defined for it.  This provides a means for
  77. --                 converting between VSTRINGs declared in separate instant-
  78. --                 iations of VSTRINGS.  When instantiating CONVERT for 
  79. --                 VSTRINGs, the STR and VSTR functions are implicitly defined,
  80. --                 provided that they have been made visible (by a use clause).
  81. --
  82. --                 Note:  CONVERT is NOT implicitly associated with the type 
  83. --                 VSTRING declared in this package (since it would not be a
  84. --                 derivable function (see RM 3.4(11))).
  85. --
  86. --                 Caution:  CONVERT cannot be instantiated directly with the
  87. --                 names VSTR and STR, since the name of the subprogram being
  88. --                 declared would hide the generic parameters with the same
  89. --                 names (see RM 8.3(16)).  CONVERT can be instantiated with
  90. --                 the operator "+", and any instantiation of CONVERT can
  91. --                 subsequently be renamed VSTR or STR.
  92. --
  93. --                 Example:  Given two VSTRINGS instantiations X and Y:
  94. --                   function "+" is new X.CONVERT(X.VSTRING, Y.VSTRING);
  95. --                   function "+" is new X.CONVERT(Y.VSTRING, X.VSTRING);
  96. --
  97. --                   (Y.CONVERT could have been used in place of X.CONVERT)
  98. --
  99. --                   function VSTR(A : X.VSTRING) return Y.VSTRING renames "+";
  100. --                   function VSTR(A : Y.VSTRING) return X.VSTRING renames "+";
  101. --
  102. --                 "+" is equivelent to VSTR.  It is supplied as a short-hand
  103. --                 notation for the function.  The "+" operator cannot immed-
  104. --                 iately follow the "&" operator; use ... & (+ ...) instead.
  105. pragma PAGE;
  106.  
  107. --  DISCUSSION:
  108. --
  109. --    This package implements the type "variable-length string" (vstring)
  110. --    using generics.  The alternative approaches are to use a discriminant 
  111. --    record in which the discriminant controls the length of a STRING inside
  112. --    the record, or a record containing an access type which points to a
  113. --      string, which can be deallocated and reallocated when necessary.
  114. --
  115. --    Advantages of this package:
  116. --      * The other approaches force the vstring to be a limited private 
  117. --          type.  Thus, their vstrings cannot appear on the left side of
  118. --          the assignment operator; ie., their vstrings cannot be given
  119. --          initial values or values by direct assignment.  This package
  120. --          uses a private type; therefore, these things can be done.
  121. --         
  122. --      * The other approach stores the vstring in a string whose length
  123. --        is determined dynamically.  This package uses a fixed length 
  124. --          string.  This difference might be reflected in faster and more
  125. --          consistent execution times (this has NOT been verified).
  126. --
  127. --    Disadvantages of this package:
  128. --      * Different instantiations must be used to declare vstrings with
  129. --        different maximum lengths (this may be desirable, since
  130. --        CONSTRAINT_ERROR will be raised if the maximum is exceeded).
  131. --
  132. --      * A second declaration is required to give the type declared by
  133. --        the instantiation a name other than "VSTRING."
  134. --
  135. --      * The storage required for a vstring is determined by the generic
  136. --        parameter LAST and not the actual length of its contents.  Thus,
  137. --          each object is allocated the maximum amount of storage, regardless
  138. --          of its actual size.
  139. --
  140. --  MISCELLANEOUS:
  141. --     Constraint checking is done explicitly in the code; thus, it cannot
  142. --     be suppressed.  On the other hand, constraint checking is not lost
  143. --     if pragma suppress is supplied to the compilation (-S option) 
  144. --     (The robustness of the explicit constraint checking has NOT been 
  145. --     determined).
  146. --
  147. --     Compiling with the optimizer (-O option) may significantly reduce
  148. --     the size (and possibly execution time) of the resulting executable.
  149. --
  150. --     Compiling an instantiation of VSTRINGS is roughly equivelent to
  151. --     recompiling VSTRINGS.  Since this takes a significant amount of time,
  152. --     and the instantiation does not depend on any other library units,
  153. --     it is STRONGLY recommended that the instantiation be compiled
  154. --     separately, and thus done only ONCE.
  155. --
  156. --  USAGE: with VSTRINGS;
  157. --         package package_name is new VSTRINGS(maximum_length);
  158. -- .......................................................................... --
  159. pragma PAGE;
  160.  
  161. with TEXT_IO; use TEXT_IO;
  162. generic
  163.   LAST : NATURAL;
  164. package VSTRINGS is
  165.  
  166.   subtype STRINDEX is NATURAL;
  167.   FIRST : constant STRINDEX := STRINDEX'FIRST + 1;
  168.   type VSTRING is private;
  169.   NUL : constant VSTRING;
  170.  
  171. -- Attributes of a VSTRING
  172.  
  173.   function LEN(FROM : VSTRING) return STRINDEX;
  174.   function MAX(FROM : VSTRING) return STRINDEX;
  175.   function STR(FROM : VSTRING) return STRING;
  176.   function CHAR(FROM: VSTRING; POSITION : STRINDEX := FIRST)
  177.                 return CHARACTER;
  178.  
  179. -- Comparisons
  180.  
  181.   function "<" (LEFT: VSTRING; RIGHT: VSTRING) return BOOLEAN;
  182.   function ">" (LEFT: VSTRING; RIGHT: VSTRING) return BOOLEAN;
  183.   function "<=" (LEFT: VSTRING; RIGHT: VSTRING) return BOOLEAN;
  184.   function ">=" (LEFT: VSTRING; RIGHT: VSTRING) return BOOLEAN;
  185.   -- "=" and "/=" are predefined
  186.  
  187. -- Input/Output
  188.  
  189.   procedure PUT(FILE : in FILE_TYPE; ITEM : in VSTRING);
  190.   procedure PUT(ITEM : in VSTRING);
  191.  
  192.   procedure PUT_LINE(FILE : in FILE_TYPE; ITEM : in VSTRING);
  193.   procedure PUT_LINE(ITEM : in VSTRING);
  194.  
  195.   procedure GET(FILE : in FILE_TYPE; ITEM : out VSTRING;
  196.                 LENGTH : in STRINDEX := LAST);
  197.   procedure GET(ITEM : out VSTRING; LENGTH : in STRINDEX := LAST);
  198.  
  199.   procedure GET_LINE(FILE : in FILE_TYPE; ITEM : in out VSTRING);
  200.   procedure GET_LINE(ITEM : in out VSTRING);
  201.  
  202. -- Extraction
  203.  
  204.   function SLICE(FROM: VSTRING; FRONT, BACK : STRINDEX) return VSTRING;
  205.   function SUBSTR(FROM: VSTRING; START, LENGTH: STRINDEX) return VSTRING;
  206.   function DELETE(FROM: VSTRING; FRONT, BACK : STRINDEX) return VSTRING;
  207.  
  208. -- Editing
  209.  
  210.   function INSERT(TARGET: VSTRING; ITEM: VSTRING;
  211.                   POSITION: STRINDEX := FIRST) return VSTRING;
  212.   function INSERT(TARGET: VSTRING; ITEM: STRING;
  213.                   POSITION: STRINDEX := FIRST) return VSTRING;
  214.   function INSERT(TARGET: VSTRING; ITEM: CHARACTER;
  215.                   POSITION: STRINDEX := FIRST) return VSTRING;
  216.  
  217.   function APPEND(TARGET: VSTRING; ITEM: VSTRING; POSITION: STRINDEX)
  218.                   return VSTRING;
  219.   function APPEND(TARGET: VSTRING; ITEM: STRING; POSITION: STRINDEX)
  220.                   return VSTRING;
  221.   function APPEND(TARGET: VSTRING; ITEM: CHARACTER; POSITION: STRINDEX)
  222.                   return VSTRING;
  223.  
  224.   function APPEND(TARGET: VSTRING; ITEM: VSTRING) return VSTRING;
  225.   function APPEND(TARGET: VSTRING; ITEM: STRING) return VSTRING;
  226.   function APPEND(TARGET: VSTRING; ITEM: CHARACTER) return VSTRING;
  227.  
  228.   function REPLACE(TARGET: VSTRING; ITEM: VSTRING;
  229.                    POSITION: STRINDEX := FIRST) return VSTRING;
  230.   function REPLACE(TARGET: VSTRING; ITEM: STRING;
  231.                    POSITION: STRINDEX := FIRST) return VSTRING;
  232.   function REPLACE(TARGET: VSTRING; ITEM: CHARACTER;
  233.                    POSITION: STRINDEX := FIRST) return VSTRING;
  234.  
  235. -- Concatenation
  236.  
  237.   function "&" (LEFT: VSTRING; RIGHT : VSTRING) return VSTRING;
  238.   function "&" (LEFT: VSTRING; RIGHT : STRING) return VSTRING;
  239.   function "&" (LEFT: VSTRING; RIGHT : CHARACTER) return VSTRING;
  240.   function "&" (LEFT: STRING; RIGHT : VSTRING) return VSTRING;
  241.   function "&" (LEFT: CHARACTER; RIGHT : VSTRING) return VSTRING;
  242.  
  243. -- Determine the position of a substring
  244.  
  245.   function INDEX(WHOLE: VSTRING; PART: VSTRING; OCCURRENCE : NATURAL := 1)
  246.                  return STRINDEX;
  247.   function INDEX(WHOLE : VSTRING; PART : STRING; OCCURRENCE : NATURAL := 1)
  248.                  return STRINDEX;
  249.   function INDEX(WHOLE : VSTRING; PART : CHARACTER; OCCURRENCE : NATURAL := 1)
  250.                  return STRINDEX;
  251.  
  252.  
  253.   function RINDEX(WHOLE: VSTRING; PART: VSTRING; OCCURRENCE : NATURAL := 1)
  254.                  return STRINDEX;
  255.   function RINDEX(WHOLE : VSTRING; PART : STRING; OCCURRENCE : NATURAL := 1)
  256.                  return STRINDEX;
  257.   function RINDEX(WHOLE : VSTRING; PART : CHARACTER; OCCURRENCE : NATURAL := 1)
  258.                  return STRINDEX;
  259.  
  260. -- Conversion from other associated types
  261.  
  262.   function VSTR(FROM : STRING) return VSTRING;
  263.   function VSTR(FROM : CHARACTER) return VSTRING;
  264.   function "+" (FROM : STRING) return VSTRING;
  265.   function "+" (FROM : CHARACTER) return VSTRING;
  266.  
  267.   generic
  268.     type FROM is private;
  269.     type TO is private;
  270.     with function STR(X : FROM) return STRING is <>;
  271.     with function VSTR(Y : STRING) return TO is <>;
  272.    function CONVERT(X : FROM) return TO;
  273.  
  274. pragma PAGE;
  275.  
  276.   private
  277.     type VSTRING is
  278.       record 
  279.         LEN : STRINDEX := STRINDEX'FIRST;
  280.         VALUE : STRING(FIRST .. LAST) := (others => ASCII.NUL);
  281.       end record;
  282.  
  283.     NUL : constant VSTRING := (STRINDEX'FIRST, (others => ASCII.NUL));
  284. end VSTRINGS;
  285. --
  286. -- .......................................................................... --
  287. --
  288. -- DISTRIBUTION AND COPYRIGHT:
  289. --                                                           
  290. -- This software is released to the Public Domain (note:
  291. --   software released to the Public Domain is not subject
  292. --   to copyright protection).
  293. -- Restrictions on use or distribution:  NONE
  294. --                                                           
  295. -- DISCLAIMER:
  296. --                                                           
  297. -- This software and its documentation are provided "AS IS" and
  298. -- without any expressed or implied warranties whatsoever.
  299. -- No warranties as to performance, merchantability, or fitness
  300. -- for a particular purpose exist.
  301. --
  302. -- Because of the diversity of conditions and hardware under
  303. -- which this software may be used, no warranty of fitness for
  304. -- a particular purpose is offered.  The user is advised to
  305. -- test the software thoroughly before relying on it.  The user
  306. -- must assume the entire risk and liability of using this
  307. -- software.
  308. --
  309. -- In no event shall any person or organization of people be
  310. -- held responsible for any direct, indirect, consequential
  311. -- or inconsequential damages or lost profits.
  312.